home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / PowerPlant / AGA Classes 1.2 / Sliders / LAGASquareVSlider.cp < prev    next >
Text File  |  1996-06-30  |  12KB  |  417 lines

  1. // ===========================================================================
  2. //    LAGASquareVSlider.cp
  3. // ===========================================================================
  4. //    “Apple Grayscale Appearance” compliant vertical slider control with rectangular indicator
  5. //    Copyright © 1996 Chrisoft (Christophe ANDRES)  All rights reserved.
  6. //
  7. //    You may use this source code in any application (commercial, shareware, freeware,
  8. //    postcardware, etc), but not remove this notice (no need to acknowledge the use of
  9. //    this class in the about box)
  10. //    You may not sell this source code in any form. This source code may be placed on 
  11. //    publicly accessable archive sites and source code disks. It may not be placed on 
  12. //    profit archive sites and source code disks without the permission of the author, 
  13. //    Christophe ANDRES.
  14. //    
  15. //        This source code is distributed in the hope that it will be useful,
  16. //        but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. //        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  18. //
  19. //    If you make any change or improvement on this class, please send the improved/changed
  20. //    version to : chrisoft@calva.net or Christophe ANDRES
  21. //                                     20, rue Prosper Mérimée
  22. //                                     67100 STRASBOURG
  23. //                                     FRANCE
  24. //
  25. // ===========================================================================
  26. //    LAGASquareVSlider.h            <- double-click + Command-D to see class declaration
  27. //
  28. //    LAGASquareVSlider is my implementation of the “Apple Grayscale Appearance for System 7.5”
  29. //        vertical square slider control
  30. //
  31. //        This class requires LAGASliderBase.cp to be present in your project
  32. //        This class requires AGAColors.cp to be present in your project
  33. //
  34. //        Version : 1.2
  35. //
  36. //        Change History (most recent first, date in US form : mm/dd/yy):
  37. //
  38. //                        06/30/96    ca        Public release of version 1.2
  39. //                        06/27/96    ca        Changed checks for disabled state (check on triState_On instead of triState_Off)
  40. //                                                            in order that triState_Latent state is drawn as disabled
  41. //                        06/04/96    ca        Added RegisterClass method to ease registry
  42. //                                                        Increased version to 1.2
  43. //                        05/16/96    ca        class made available by Christophe ANDRES <chrisoft@calva.net>
  44. //                                                        (version 1.1)
  45. //
  46. //        To Do:
  47. //
  48.  
  49. #include "LAGASquareVSlider.h"
  50. #include "AGAColors.h"
  51. #include <UDrawingState.h>
  52. #include <PP_Types.h>
  53.  
  54. //    begin    <06/04/96    ca>
  55. void LAGASquareVSlider::RegisterClass ()
  56.  
  57. {
  58.     URegistrar::RegisterClass(LAGASquareVSlider::class_ID, (ClassCreatorFunc)LAGASquareVSlider::CreateAGASquareVSliderStream);
  59. }
  60. //    end    <06/04/96    ca>
  61.  
  62. LAGASquareVSlider* LAGASquareVSlider::CreateAGASquareVSliderStream (LStream *inStream)
  63.  
  64. {
  65.     return(new LAGASquareVSlider(inStream));
  66. }
  67.  
  68. //-------Constructors-------------------------------------------------------------------------------------------------
  69.  
  70. LAGASquareVSlider::LAGASquareVSlider ()
  71.  
  72. {
  73.     mTrackOriginTinkering = 1;
  74. }
  75.  
  76. LAGASquareVSlider::LAGASquareVSlider (LStream    *inStream) : LAGASliderBase(inStream)
  77.  
  78. {
  79.     mTrackOriginTinkering = 1;
  80. }
  81.  
  82. LAGASquareVSlider::LAGASquareVSlider (const LAGASquareVSlider &inOriginal) : LAGASliderBase(inOriginal)
  83.  
  84. {
  85.     mTrackOriginTinkering = 1;
  86. }
  87.  
  88. LAGASquareVSlider::LAGASquareVSlider (const SPaneInfo    &inPaneInfo, MessageT inValueMessage, Boolean inBottomRightPointer,
  89.                                                                             Int32 inInitialValue, Int32 inMinValue, Int32 inMaxValue)
  90.                                                                         : LAGASliderBase(inPaneInfo, inValueMessage, true, inBottomRightPointer, inInitialValue,
  91.                                                                                                                 inMinValue, inMaxValue)
  92. {
  93.     mTrackOriginTinkering = 1;
  94. }
  95.  
  96. //-------Drawers----------------------------------------------------------------------------------------------------
  97.  
  98.  
  99. void LAGASquareVSlider::DrawIndicator (Boolean inPushed)
  100.  
  101. {
  102.     StColorPenState theState;
  103.     Boolean hasColor = ::PaneInColor(this);
  104.     Boolean disabled = (mEnabled != triState_On);                                                                                                    //    <06/27/96    ca>
  105.     Rect frame;
  106.  
  107.     theState.Normalize();
  108.     CalcLocalFrameRect(frame);
  109.     
  110.     short position = GetIndicatorPosition();
  111.     
  112.     //short origin = (mRightBottomPointing ? frame.left : frame.right - 1);
  113.     
  114.     ::SetRect(&frame, frame.left, position - 6, frame.left + 16, position + 7);
  115.     if (hasColor)
  116.         ::RGBBackColor(&gAGAColorArray[2]);
  117.     EraseRect(&frame);
  118.     
  119.     if (hasColor && !disabled)
  120.         {
  121.             Rect r = frame;
  122.             InsetRect(&r, 1, 1);
  123.             ::RGBBackColor((inPushed ? &gAGAColorArray[8] : &gAGAColorArray[5]));
  124.             EraseRect(&r);
  125.         }
  126.     if (disabled)
  127.         if (hasColor)
  128.             ::RGBForeColor(&gAGAColorArray[8]);
  129.         else
  130.             PenPat(&qd.gray);
  131.     ::MoveTo(frame.left, position - 5);
  132.     ::Line(0, 10);
  133.     ::Move(1, 1);        ::Line(13, 0);
  134.     ::Move(1, -1);    ::Line(0, -10);
  135.     ::Move(-1, -1);    ::Line(-13, 0);
  136.     if (hasColor)
  137.         {
  138.             ::RGBForeColor((disabled ? &gAGAColorArray[1] : (inPushed ? &gAGAColorArray[5] : &gAGAColorArray[3])));
  139.             ::Move(1, 1);        ::Line(11, 0);
  140.             ::Move(-12, 1);    ::Line(0, 8);
  141.             ::RGBForeColor((disabled ? &gAGAColorArray[4] : (inPushed ? &gAGAColorArray[10] : &gAGAColorArray[8])));
  142.             ::Move(1, 1);        ::Line(12, 0);
  143.             ::Line(0, -9);
  144.             ::RGBForeColor((disabled ? &gAGAColorArray[W] : (inPushed ? &gAGAColorArray[3] : &gAGAColorArray[1])));
  145.             ::Move(-13, -1);    ::Line(0, 0);
  146.         }
  147.     if (!disabled)
  148.         {
  149.             if (hasColor)
  150.                 {
  151.                     ::Move(3, 2);        ::Line(0, 0);
  152.                     ::Move(0, 2);        ::Line(0, 0);
  153.                     ::Move(0, 2);        ::Line(0, 0);
  154.                     ::RGBForeColor((inPushed ? &gAGAColorArray[12] : &gAGAColorArray[10]));
  155.                 }
  156.             else
  157.                 ::Move(2, 7);
  158.             ::Move(1, 1);        ::Line(6, 0);
  159.             ::Move(0, -2);    ::Line(-6, 0);
  160.             ::Move(0, -2);    ::Line(6, 0);
  161.             if (hasColor)
  162.                 {
  163.                     ::RGBForeColor((inPushed ? &gAGAColorArray[5] : &gAGAColorArray[3]));
  164.                     ::Move(-1, -1);    ::Line(-5, 0);
  165.                     ::Move(0, 2);        ::Line(5, 0);
  166.                     ::Move(0, 2);        ::Line(-5, 0);
  167.                 }
  168.         }
  169. }
  170.  
  171. Int16 LAGASquareVSlider::FindHotSpot (Point inPoint)
  172.  
  173. {
  174.     Rect frame;
  175.     
  176.     //    The only hot spot we know of in a slider is the pointer
  177.     GetIndicatorRect(frame);
  178.                                         
  179.     return(::PtInRect(inPoint, &frame) ? 1 : 0);
  180. }
  181.  
  182. Boolean LAGASquareVSlider::PointInHotSpot (Point inPoint, Int16 inHotSpot)
  183.  
  184. {
  185.     Rect frame;
  186.     
  187.     //    The only hot spot we know of in a slider is the pointer
  188.     GetIndicatorRect(frame);
  189.                                     
  190.     return(::PtInRect(inPoint, &frame));
  191. }
  192.  
  193. short LAGASquareVSlider::GetIndicatorPosition ()
  194.  
  195. {
  196.     Rect frame;
  197.  
  198.     CalcLocalFrameRect(frame);
  199.     double size = (frame.bottom - frame.top) - 20;
  200.     double division = size / (double)(mMaxValue - mMinValue);
  201.     
  202.     return(frame.bottom - 10 - ((mValue - mMinValue) * division));
  203. }
  204.  
  205. void LAGASquareVSlider::GetIndicatorRect (Rect &outRect)
  206.  
  207. {
  208.     Rect frame;
  209.     
  210.     CalcLocalFrameRect(frame);
  211.     short position = GetIndicatorPosition();
  212.     
  213.     ::SetRect(&outRect, frame.left, position - 6, frame.left + 16, position + 7);
  214. }
  215.  
  216. void LAGASquareVSlider::InitializeGhost ()
  217.  
  218. {
  219.     Boolean hasColor = ::PaneInColor(this);
  220.     Rect r;
  221.  
  222.     LAGASliderBase::InitializeGhost();
  223.     
  224.     mGhostPointer->BeginDrawing();
  225.     
  226.     if (hasColor)
  227.         ::RGBBackColor(&gAGAColorArray[2]);
  228.     ::SetRect(&r, 0, 0, 16, 13);
  229.     ::EraseRect(&r);
  230.     
  231.     if (hasColor)
  232.         ::RGBForeColor(&gAGAColorArray[7]);
  233.     ::MoveTo(0, 1);    ::Line(0, 10);
  234.     ::Move(1, 1);        ::Line(13, 0);
  235.     ::Move(1, -1);    ::Line(0, -10);
  236.     ::Move(-1, -1);    ::Line(-13, 0);
  237.     if (hasColor)
  238.         {
  239.             ::RGBForeColor(&gAGAColorArray[11]);
  240.             ::Move(4, 0);        ::Line(0, 0);
  241.             ::Move(4, 0);        ::Line(0, 0);
  242.             ::Move(0, 12);    ::Line(0, 0);
  243.             ::Move(-4, 0);    ::Line(0, 0);
  244.             ::RGBForeColor(&gAGAColorArray[7]);
  245.             ::Move(0, -1);    ::Line(0, 0);
  246.             ::Move(4, 0);        ::Line(0, 0);
  247.             ::RGBForeColor(&gAGAColorArray[5]);
  248.             ::Move(0, -1);    ::Line(0, -1);
  249.             ::Move(-4, 1);    ::Line(0, -1);
  250.             ::Move(1, -1);    ::Line(2, 0);
  251.             ::Move(2, 0);        ::Line(1, 0);
  252.             ::Move(0, -2);    ::Line(-1, 0);
  253.             ::Move(-2, 0);    ::Line(-2, 0);
  254.             ::Move(0, -2);    ::Line(2, 0);
  255.             ::Move(2, 0);        ::Line(1, 0);
  256.             ::Move(-2, -2);    ::Line(0, 0);
  257.             ::Move(-4, 0);    ::Line(0, 0);
  258.             ::RGBForeColor(&gAGAColorArray[9]);
  259.             ::Move(0, 2);        ::Line(0, 0);
  260.             ::Move(0, 2);        ::Line(0, 0);
  261.             ::Move(0, 2);        ::Line(0, 0);
  262.             ::Move(4, 0);        ::Line(0, 0);
  263.             ::Move(0, -2);    ::Line(0, 0);
  264.             ::Move(0, -2);    ::Line(0, 0);
  265.             ::ForeColor(whiteColor);
  266.             ::Move(1, -1);    ::Line(0, 0);
  267.             ::Move(-2, 0);    ::Line(-2, 0);
  268.             ::Move(-2, 0);    ::Line(0, 0);
  269.             ::Move(0, 2);        ::Line(0, 0);
  270.             ::Move(2, 0);        ::Line(2, 0);
  271.             ::Move(2, 0);        ::Line(0, 0);
  272.             ::Move(0, 2);        ::Line(0, 0);
  273.             ::Move(-2, 0);    ::Line(-2, 0);
  274.             ::Move(-2, 0);    ::Line(0, 0);
  275.             ::Move(-3, 3);    ::Line(0, -8);
  276.             ::Move(1, -1);    ::Line(2, 0);
  277.             ::Move(2, 0);        ::Line(2, 0);
  278.             ::Move(2, 0);        ::Line(2, 0);
  279.         }
  280.     mGhostPointer->EndDrawing();
  281.  
  282.     //    Define a region to draw the pointer nicely if the ghost passes on its top
  283.     mGhostMask = ::NewRgn();
  284.     ::OpenRgn();
  285.     ::MoveTo(0, 1);    ::Line(0, 11);
  286.     ::Line(1, 1);        ::Line(13, 0);
  287.     ::Line(2, -2);    ::Line(0, -10);
  288.     ::Line(-2, -1);    ::Line(-13, 0);
  289.     ::Line(-1, 1);
  290.     ::CloseRgn(mGhostMask);
  291. }
  292.  
  293. void LAGASquareVSlider::DrawGhost (Point inPoint)
  294.  
  295. {
  296.     Rect frame;
  297.     short position;
  298.  
  299.     if (inPoint.v != mLastPosition.v)
  300.         {
  301.             Rect indicRect, overStep;
  302.             
  303.             CalcLocalFrameRect(frame);
  304.             double size = (frame.bottom - frame.top) - 20;
  305.             double division = size / (double)(mMaxValue - mMinValue);
  306.             
  307.             short MaxPt = frame.bottom - 10 - ((mMaxValue - mMinValue) * division);
  308.             short MinPt = frame.bottom - 10;
  309.             if (inPoint.v < MaxPt)
  310.                 position = MaxPt;
  311.             else
  312.                 if (inPoint.v > MinPt)
  313.                     position = MinPt;
  314.                 else
  315.                     position = inPoint.v;
  316.             
  317.             frame.right = frame.left + 16;
  318.             frame.top = position - 6;
  319.             frame.bottom = frame.top + 13;
  320.             
  321.             if (!::EmptyRect(&mLastGhost))
  322.                 {
  323.                     indicRect = mLastGhost;
  324.                     StClipRgnState clip;
  325.                     
  326.                     if (indicRect.top < frame.top)
  327.                         {
  328.                             if (indicRect.bottom > frame.top)
  329.                                 indicRect.bottom = frame.top;
  330.                         }
  331.                     else
  332.                         {
  333.                             if (frame.bottom > indicRect.top)
  334.                                 indicRect.top = frame.bottom;
  335.                         }
  336.                     clip.ClipToIntersection(indicRect);
  337.                     ::RGBBackColor(&gAGAColorArray[2]);
  338.                     ::EraseRect(&mLastGhost);
  339.                     DrawSlideTrack();
  340.                     GetIndicatorRect(indicRect);
  341.                     if (::SectRect(&indicRect, &mLastGhost, &overStep))
  342.                         DrawIndicator(true);
  343.                 }
  344.             
  345.             StColorPenState theState;
  346.             theState.Normalize();
  347.             mGhostPointer->CopyImage(GetMacPort(), frame);
  348.  
  349.             if ((!::EmptyRect(&overStep)) && (mGhostMask != nil))
  350.                 {
  351.                     StClipRgnState clip;
  352.                     ::OffsetRgn(mGhostMask, -(*mGhostMask)->rgnBBox.left, -(*mGhostMask)->rgnBBox.top);
  353.                     ::OffsetRgn(mGhostMask, frame.left, frame.top);
  354.                     RgnHandle theClipRegion = ::NewRgn();
  355.                     GetIndicatorRect(indicRect);
  356.                     ::RectRgn(theClipRegion, &indicRect);
  357.                     ::DiffRgn(theClipRegion, mGhostMask, theClipRegion);
  358.                     clip.ClipToIntersectionRgn(theClipRegion);
  359.                     DrawIndicator(true);
  360.                 }
  361.             mLastGhost = frame;
  362.             mLastPosition = inPoint;
  363.         }
  364. }
  365.  
  366. void LAGASquareVSlider::FinishTrackHotSpot (Point inPoint)
  367.  
  368. {
  369.     Boolean hasColor = ::PaneInColor(this);
  370.     Rect frame, indicRect;
  371.     short newValue;
  372.  
  373.     CalcLocalFrameRect(frame);
  374.     double size = (frame.bottom - frame.top) - 20;
  375.     double division = size / (double)(mMaxValue - mMinValue);
  376.             
  377.     short MaxPt = frame.bottom - 10 - ((mMaxValue - mMinValue) * division);
  378.     short MinPt = frame.bottom - 10;
  379.     if (inPoint.v <= MaxPt)
  380.         newValue = mMaxValue;
  381.     else
  382.         if (inPoint.v >= MinPt)
  383.             newValue = mMinValue;
  384.         else
  385.             {
  386.                 newValue = ((MinPt - inPoint.v) / division) + mMinValue;
  387.                 short lowPos = frame.bottom - 11 - (newValue * division);
  388.                 short highPos = frame.bottom - 11 - ((newValue + 1) * division);
  389.                 if ((lowPos - inPoint.v) > (inPoint.v - highPos))
  390.                     newValue++;
  391.             }
  392.     
  393.     if (newValue != mValue)
  394.         {
  395.             StClipRgnState clip;
  396.             clip.Normalize();
  397.             GetIndicatorRect(indicRect);
  398.             if (hasColor)
  399.                 ::RGBBackColor(&gAGAColorArray[2]);
  400.             ::EraseRect(&indicRect);
  401.             ::EraseRect(&mLastGhost);
  402.             DrawSlideTrack();
  403.             //    Update our control value and Broadcast it
  404.             SetValue(newValue);
  405.         }
  406.     else
  407.         {
  408.             if (hasColor)
  409.                 ::RGBBackColor(&gAGAColorArray[2]);
  410.             ::EraseRect(&mLastGhost);
  411.             DrawSlideTrack();
  412.         }
  413.     //    We dont redraw the pointer here, because it will anyway be redrawn in the unpressed state
  414.     //    in the method LAGASliderBase::HotSpotResult
  415. }
  416.  
  417.